package alto_nivel.compilador;

import alto_nivel.gals.ItemTabelaSimbolos;

public class PilhaOperandos {

    private NoPilhaOperandos prim;

    public PilhaOperandos() {}

    public void libera() {

        NoPilhaOperandos p = prim;

        while (p != null) {

            NoPilhaOperandos t = p.getProx();
            p = null;
            p = t;
        }
        prim = null;
    }

    public int pop() {

        if (vazia()) {
            return -1;

        } else {
            int valor = prim.getValor();
            prim = prim.getProx();
            return valor;
        }
    }

    public NoPilhaOperandos popNoPilha() {

        if (vazia()) {
            return null;

        } else {
            NoPilhaOperandos no = prim;
            prim = prim.getProx();
            return no;
        }
    }

    public void push(int valor) {
        NoPilhaOperandos novo = new NoPilhaOperandos();
        novo.setValor(valor);
        novo.setProx(prim);
        prim = novo;
    }

    public void pushNoItem(ItemTabelaSimbolos item) {
        NoPilhaOperandos novo = new NoPilhaOperandos();
        novo.setItem(item);
        novo.setProx(prim);
        prim = novo;
    }

    public void pushNoValorSequencial(int valorSequencial) {
        NoPilhaOperandos novo = new NoPilhaOperandos();
        novo.setValorSequencial(valorSequencial);
        novo.setResultadoTemporario(true);
        novo.setProx(prim);
        prim = novo;
    }

    public boolean vazia() {
        return (prim == null);
    }

    @Override
    public String toString() {

        NoPilhaOperandos p = prim;
        String temp = "";

        while (p != null) {
            temp = temp + p.getValor() + " ";
            p = p.getProx();
        }
        return temp;
    }

    public int getPrim() {
        return prim.getValor();
    }

    public int tamanho() {

        if (prim == null) {
            return 0;

        } else {

            int contador = 1;
            NoPilhaOperandos p = prim;

            while (p != null) {
                p = p.getProx();
                contador++;
            }
            return contador;
        }
    }

}
